/*
  泛型：定义时先不给具体类型，而是在使用时才给类型

*/

interface Keys {
  name: string;
  age: number;
}

// <T> 定义一个泛型参数
// K extends Keys 泛型约束
// T = any 泛型默认值
// interface ResponseData<K extends Keys, T = any> {
//   code: number;
//   message: string;
//   ok: boolean;
//   data: T; // 使用上泛型参数T
//   key?: K;
// }

// type Test = ResponseData<{ name: string; age: number; sex: number }, string>;

// 泛型工具类型
interface ResponseData<T = any> {
  code: number;
  message?: string;
  ok?: boolean;
  data: T;
}

type Test = Required<ResponseData>; // 将 ResponseData 类型中所有属性变成必选属性
type Test1 = Partial<ResponseData>; // 将 ResponseData 类型中所有属性变成可选属性
type Test2 = Pick<ResponseData, "code" | "data">; // 从 ResponseData 类型中挑选一部分属性组成新类型
type Test3 = Omit<ResponseData, "code" | "data">; // 从 ResponseData 类型中排除一部分属性剩下属性组成新类型
